{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "40157b48",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# 中枢神经系统药物研发：药物筛选与优化 \n",
    "### Python 语法复习\n",
    "<p></p>\n",
    "\n",
    "**Datawhale X Deepmodeling AI for Science 学习赛**"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9725717a",
   "metadata": {},
   "source": [
    "<p>骆秀韬 epsilon_luoo@outlook.com</p>\n",
    "\n",
    "聪明办法学 Python 教学团队"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6951a280",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# print( ) 与 注释"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "76135e51",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "第一行代码"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "id": "1ad1d911",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-11-17T13:21:52.700802Z",
     "start_time": "2023-11-17T13:21:52.697851Z"
    },
    "run_control": {
     "marked": false
    },
    "slideshow": {
     "slide_type": "-"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "hello, world\n"
     ]
    }
   ],
   "source": [
    "print(\"hello, world\") # f(x)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7370d7b8",
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "source": [
    "**单行注释** 使用 `#` 开头，`#` 后面的内容不会被当做代码，只能写在一行中"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "578e7867",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-11-17T12:06:39.820941Z",
     "start_time": "2023-11-17T12:06:39.816839Z"
    },
    "slideshow": {
     "slide_type": "-"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Datawhale\n"
     ]
    }
   ],
   "source": [
    "print(\"Datawhale\") # for the learner，和学习者一起成长"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "0911a0cd",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-11-17T12:06:10.958404Z",
     "start_time": "2023-11-17T12:06:10.954758Z"
    },
    "run_control": {
     "marked": false
    },
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "p2s\n"
     ]
    }
   ],
   "source": [
    "# learn python the smart way v2\n",
    "print(\"p2s\")\n",
    "# print(\"prepare to be smart\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7a29d72e",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "每一个 `print()` 会默认换行"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "0d566b73",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-11-17T12:08:33.154939Z",
     "start_time": "2023-11-17T12:08:33.150234Z"
    },
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Data\n",
      "whale\n"
     ]
    }
   ],
   "source": [
    "print(\"Data\")\n",
    "print(\"whale\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "7dfa7029",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-11-17T12:09:04.591665Z",
     "start_time": "2023-11-17T12:09:04.587262Z"
    },
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Datawhale\n"
     ]
    }
   ],
   "source": [
    "print(\"Data\", end=\"\")\n",
    "print(\"whale\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "af768399",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "多个内容是以**空格**分隔"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "d040a1f9",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-11-17T12:09:27.873318Z",
     "start_time": "2023-11-17T12:09:27.868864Z"
    },
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Data whale\n"
     ]
    }
   ],
   "source": [
    "print(\"Data\", \"whale\") # f(x, y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "6e69a6e4",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-11-17T12:09:54.133858Z",
     "start_time": "2023-11-17T12:09:54.129560Z"
    },
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Data*whale\n"
     ]
    }
   ],
   "source": [
    "print(\"Data\", \"whale\", sep=\"*\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b9db6fc2",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# 列表与字典"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "672fbe08",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "**列表是一种序列**，它是**可变**的\n",
    "\n",
    "> 容器的唯一作用就是打包、解包、内容传递。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "fcc53480",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-11-17T12:11:55.646086Z",
     "start_time": "2023-11-17T12:11:55.641378Z"
    },
    "run_control": {
     "marked": false
    },
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['learn', 'python', 'the', 'smart', 'way']\n"
     ]
    }
   ],
   "source": [
    "p2s = [\"learn\", \"python\", \"the\", \"smart\", \"way\"] # 从 0 开始计数\n",
    "print(p2s)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "dc687c7c",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-11-17T12:12:14.225984Z",
     "start_time": "2023-11-17T12:12:14.221836Z"
    },
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "python learn way smart\n"
     ]
    }
   ],
   "source": [
    "print(p2s[1], p2s[0], p2s[-1], p2s[-2]) # 索引 index"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "57cb6d1d",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-11-17T12:13:25.034414Z",
     "start_time": "2023-11-17T12:13:25.030579Z"
    },
    "scrolled": false,
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['learn', 'python']\n",
      "['the', 'smart', 'way']\n"
     ]
    }
   ],
   "source": [
    "print(p2s[0:2]) # 切片\n",
    "print(p2s[2:]) # 左闭右开区间，起始 0，终止 -1"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2de59561",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "字典是**键值对**的集合"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "9d2f2a6b",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-11-17T12:17:23.321006Z",
     "start_time": "2023-11-17T12:17:23.316783Z"
    },
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'h', 'a', 'D', 'w', 'l', 't', 'e'}\n"
     ]
    }
   ],
   "source": [
    "dw_set = set()\n",
    "for i in \"Datawhale\":\n",
    "    dw_set.add(i)\n",
    "print(dw_set)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "04eea9e9",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-11-17T12:20:51.194695Z",
     "start_time": "2023-11-17T12:20:51.190088Z"
    },
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Datawhale\n"
     ]
    }
   ],
   "source": [
    "dw_dict = {\"d\":\"Data\", \"w\":\"whale\"} # key: value\n",
    "print(dw_dict[\"d\"], dw_dict[\"w\"], sep=\"\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9023602e",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-13T04:47:16.317031Z",
     "start_time": "2023-07-13T04:47:16.293190Z"
    },
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "source": [
    "字典的更新"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "c381c088",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-11-17T12:21:18.573060Z",
     "start_time": "2023-11-17T12:21:18.568880Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'d': 'Data', 'w': 'Whale'}\n"
     ]
    }
   ],
   "source": [
    "dw_dict[\"w\"] = \"Whale\"\n",
    "print(dw_dict)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9a2d807c",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# [if](https://www.runoob.com/python3/python3-conditional-statements.html#:~:text=%E7%9A%84%E6%89%A7%E8%A1%8C%E8%BF%87%E7%A8%8B%3A-,%E4%BB%A3%E7%A0%81%E6%89%A7%E8%A1%8C%E8%BF%87%E7%A8%8B%EF%BC%9A,-if%20%E8%AF%AD%E5%8F%A5) and [for](https://www.runoob.com/python3/python3-loop.html#:~:text=%3A%0A%20%20%20%20%3Cstatements%3E-,%E6%B5%81%E7%A8%8B%E5%9B%BE%EF%BC%9A,-Python%20for%20%E5%BE%AA%E7%8E%AF)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7f05a03b",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "> 女朋友说，下班回来带一个西瓜。如果看到番茄，就买两个 \n",
    "\n",
    "[来源：知乎](https://www.zhihu.com/question/45194583)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "id": "fb6902fe",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-11-17T13:15:39.237121Z",
     "start_time": "2023-11-17T13:15:39.231451Z"
    },
    "init_cell": true,
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [],
   "source": [
    "def 买西瓜(num):\n",
    "    return f\"{num}个西瓜\"\n",
    "def 买番茄(num):\n",
    "    return f\"{num}个番茄\"\n",
    "\n",
    "看到番茄 = True"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "5cf27a89",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-11-17T12:25:53.967633Z",
     "start_time": "2023-11-17T12:25:53.963939Z"
    },
    "cell_style": "split",
    "run_control": {
     "marked": false
    },
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "带了2个西瓜回家\n"
     ]
    }
   ],
   "source": [
    "# 下班了\n",
    "西瓜 = 买西瓜(1)\n",
    "if 看到番茄:\n",
    "    西瓜 = 买西瓜(2)\n",
    "print(f\"带了{西瓜}回家\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "566b53f0",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-11-17T12:26:16.237332Z",
     "start_time": "2023-11-17T12:26:16.232929Z"
    },
    "cell_style": "split",
    "run_control": {
     "marked": false
    },
    "scrolled": true,
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "带了1个西瓜和2个番茄回家\n"
     ]
    }
   ],
   "source": [
    "# 女朋友心想\n",
    "西瓜 = 买西瓜(1)\n",
    "if 看到番茄:\n",
    "    番茄 = 买番茄(2)\n",
    "print(f\"带了{西瓜}和{番茄}回家\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "id": "38925f7d",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-11-17T13:22:10.212032Z",
     "start_time": "2023-11-17T13:22:10.207205Z"
    },
    "cell_style": "split",
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "🐳🐳🐳\n",
      "🐳🐳🐳\n",
      "🐳🐳🐳\n"
     ]
    }
   ],
   "source": [
    "for row in range(3): # [0, 3)\n",
    "    for col in range(3):\n",
    "        print(\"🐳\", end=\"\")\n",
    "    print()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "e2bc3e8b",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-11-17T12:30:06.816553Z",
     "start_time": "2023-11-17T12:30:06.813053Z"
    },
    "cell_style": "split",
    "scrolled": true,
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "learn\n",
      "python\n",
      "the\n",
      "smart\n",
      "way\n"
     ]
    }
   ],
   "source": [
    "for string in \"learn python the smart way\".split():\n",
    "    print(string)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "6eb860cf",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-11-17T12:30:54.598029Z",
     "start_time": "2023-11-17T12:30:54.593797Z"
    },
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['我', '秦始皇', 'V50', '吃肯德基']\n"
     ]
    }
   ],
   "source": [
    "print(\"我，秦始皇，V50，吃肯德基\".split(\"，\"))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6d78da59",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# 推导式"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "44c6d24b",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-11-17T12:32:02.844088Z",
     "start_time": "2023-11-17T12:32:02.841009Z"
    },
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n"
     ]
    }
   ],
   "source": [
    "nums = []\n",
    "for i in range(10):\n",
    "    nums.append(i)\n",
    "print(nums)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bf432f8a",
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "source": [
    "有什么问题？"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b0b5f002",
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "source": [
    "## 不够优雅"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "c368e4f3",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-11-17T12:34:06.897797Z",
     "start_time": "2023-11-17T12:34:06.893276Z"
    },
    "cell_style": "split",
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "nums = [i for i in range(10)]\n",
    "nums"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b729b2ec",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-11-17T09:12:54.524929Z",
     "start_time": "2023-11-17T09:12:54.453710Z"
    },
    "cell_style": "split",
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "source": [
    "![](https://pica.zhimg.com/50/v2-f2560f634b1e09f81522f29f363827f7_720w.jpg?source=1940ef5c)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ecf8156e",
   "metadata": {
    "cell_style": "center",
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "列表推导式\n",
    "\n",
    "```python\n",
    "[ 表达式 for 变量 in 序列 (if 条件) ]\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "9e0b2c5f",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-11-17T12:35:18.311727Z",
     "start_time": "2023-11-17T12:35:18.307585Z"
    },
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[0, 1, 2, 3, 4]"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "nums = [i for i in range(10) if i < 5]\n",
    "nums"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "55ba8ed3",
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "source": [
    "字典推导式\n",
    "```python\n",
    "{ 键（表达式）: 值（表达式） for 变量 in 序列 if 条件 }\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "50fa3834",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-11-17T12:36:43.292153Z",
     "start_time": "2023-11-17T12:36:43.287846Z"
    },
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{6: 36, 7: 49, 8: 64, 9: 81}"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "nums = {i: i**2 for i in range(10) if i > 5}\n",
    "nums"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6d516eb3",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# 自定义函数 与 return"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8c70991b",
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "source": [
    "> A function is a procedure (a sequence of statements) stored under a name that can be used repeatedly by calling the name."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "60621952",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "以 **Rectified Linear Unit (ReLU)** 函数为例，其数学表达式为：\n",
    "\n",
    "$f(x) = \\begin{cases}\n",
    "    x, x > 0, \\\\\n",
    "    0, x \\leqslant 0.\n",
    "\\end{cases}$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "e38903f5",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-11-17T12:43:11.337074Z",
     "start_time": "2023-11-17T12:43:11.332373Z"
    },
    "cell_style": "split",
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "9\n"
     ]
    }
   ],
   "source": [
    "def ReLU(x): # define\n",
    "    if x > 0:\n",
    "        return x\n",
    "    return 0\n",
    "\n",
    "print(ReLU(9))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "67ebb5f5",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-11-17T12:44:43.022447Z",
     "start_time": "2023-11-17T12:44:43.018627Z"
    },
    "cell_style": "split",
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\n"
     ]
    }
   ],
   "source": [
    "relu = lambda x: max(x, 0)\n",
    "print(relu(-9))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "id": "4a9e96fc",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-11-17T12:45:58.506837Z",
     "start_time": "2023-11-17T12:45:57.804317Z"
    },
    "cell_style": "center",
    "run_control": {
     "marked": false
    },
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x2497f90b3d0>]"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "X = [x for x in range(-10, 10)]\n",
    "Y = [relu(x) for x in range(-10, 10)]\n",
    "\n",
    "plt.plot(X, Y)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d5173404",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-13T06:30:12.381192Z",
     "start_time": "2023-07-13T06:30:12.378186Z"
    },
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# 托马斯小火车与它的对象们"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "68d2185f",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-11-17T12:51:34.895610Z",
     "start_time": "2023-11-17T12:51:34.875264Z"
    },
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [],
   "source": [
    "from random import choice\n",
    "import time\n",
    "from tqdm import tqdm\n",
    "from IPython.display import display, HTML\n",
    "\n",
    "class Train:\n",
    "    def __init__(self, name, *goods, naughty=True):\n",
    "        self.name = name\n",
    "        self.goods = goods\n",
    "        self.naughty = naughty\n",
    "    \n",
    "    def __getitem__(self, idx):\n",
    "        if self.naughty:\n",
    "            return choice(self.goods)\n",
    "        return self.goods[idx]\n",
    "    \n",
    "    def __len__(self):\n",
    "        return len(self.goods)\n",
    "    \n",
    "    def info(self):\n",
    "        if self.name == \"托马斯小火车\":\n",
    "            return f\"Hi，我是{self.name}，Cinders and ashes!\"\n",
    "        return f\"Hi，我是{self.name}\"\n",
    "    \n",
    "    def 发车(self, string):\n",
    "        print(f\"{string}，上山！\") # f-strings\n",
    "        for _ in tqdm(range(30)):\n",
    "            time.sleep(0.1)\n",
    "        display(HTML(\"<video controls width=1200 src='train.mp4'>train</video>\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "id": "a1e8ec1f",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-11-17T12:54:12.276171Z",
     "start_time": "2023-11-17T12:54:12.272311Z"
    },
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [],
   "source": [
    "Edward = Train(\"爱德华\", 1, 2.5, 9, 114, 514, naughty=False) # 实例化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "id": "14d1c19b",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-11-17T12:54:30.003172Z",
     "start_time": "2023-11-17T12:54:29.998049Z"
    },
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'Hi，我是爱德华'"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Edward.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "id": "f532074d",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-11-17T13:09:16.444115Z",
     "start_time": "2023-11-17T13:09:16.439912Z"
    },
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "hw\n"
     ]
    }
   ],
   "source": [
    "len(Edward)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "id": "d29a3fc6",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-11-17T12:59:02.938064Z",
     "start_time": "2023-11-17T12:59:02.933799Z"
    },
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "hello 514\n"
     ]
    }
   ],
   "source": [
    "a, b = Edward[3], Edward[4] # 打包与解包 ([3], [4]) -> a, b\n",
    "print(f\"hello {b}\") # f-string"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "id": "b215d3d3",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-11-17T13:03:49.227317Z",
     "start_time": "2023-11-17T13:03:49.222533Z"
    },
    "run_control": {
     "marked": false
    },
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'Hi，我是托马斯小火车，Cinders and ashes!'"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "货物 = [\"邮件\", \"大米\", \"煤矿\", \"劳斯莱斯\"]\n",
    "托马斯 = Train(\"托马斯小火车\", *货物, naughty=True )\n",
    "托马斯.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "id": "87f58c0a",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-11-17T13:03:04.647938Z",
     "start_time": "2023-11-17T13:03:04.643178Z"
    },
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(托马斯)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "id": "781d99bb",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-11-17T13:04:28.905131Z",
     "start_time": "2023-11-17T13:04:28.898894Z"
    },
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'邮件'"
      ]
     },
     "execution_count": 66,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "托马斯[2]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "id": "bb788cf8",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-11-17T13:09:48.616355Z",
     "start_time": "2023-11-17T13:09:45.574728Z"
    },
    "scrolled": true,
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "AE86，上山！\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|███████████████████████████████████████████████████████████████████████████████| 30/30 [00:03<00:00,  9.89it/s]\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<video controls width=1200 src='train.mp4'>train</video>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "托马斯.发车(\"AE86\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dc14897b",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Thank You ;-)\n",
    "Datawhale 聪明办法学 Python 教学团队出品\n",
    "\n",
    "## 关注我们\n",
    "Datawhale 是一个专注 AI 领域的开源组织，以“for the learner，和学习者一起成长”为愿景，构建对学习者最有价值的开源学习社区。关注我们，一起学习成长。\n",
    "<div align=center><img src=\"datawhale_wechat_qrcode.jpeg\" width = \"250\" height = \"270\"></div>"
   ]
  }
 ],
 "metadata": {
  "celltoolbar": "Slideshow",
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.5"
  },
  "rise": {
   "overlay": "<div class='my-top-right'><img height=40px src='datawhale_logo.png'/></div><div class='my-top-left'></div>"
  },
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
